using System;
using Avalonia.Input;
using Avalonia.Controls;

namespace FileSyncApp
{
    /// <summary>
    /// 键盘快捷键管理类
    /// 负责处理应用程序的全局键盘快捷键，提供便捷的窗口操作功能
    /// 支持的快捷键：Ctrl+H（隐藏/显示窗口）、Escape（最小化到托盘）
    /// </summary>
    public class KeyboardShortcuts
    {
        /// <summary>
        /// 主窗口引用，用于接收键盘事件和控制窗口状态
        /// </summary>
        private MainWindow? _mainWindow;
        
        /// <summary>
        /// 系统托盘管理器引用，用于执行窗口的显示、隐藏和最小化操作
        /// </summary>
        private TrayManager? _trayManager;

        /// <summary>
        /// 初始化键盘快捷键管理器
        /// 设置主窗口和托盘管理器的引用，并初始化快捷键事件处理
        /// </summary>
        /// <param name="mainWindow">主窗口实例</param>
        /// <param name="trayManager">系统托盘管理器实例</param>
        public KeyboardShortcuts(MainWindow mainWindow, TrayManager trayManager)
        {
            _mainWindow = mainWindow;
            _trayManager = trayManager;
            InitializeShortcuts();
        }

        /// <summary>
        /// 初始化键盘快捷键事件处理
        /// 为主窗口注册KeyDown事件处理程序
        /// </summary>
        private void InitializeShortcuts()
        {
            if (_mainWindow != null)
            {
                _mainWindow.KeyDown += OnKeyDown;
            }
        }

        /// <summary>
        /// 处理键盘按键事件
        /// 检测并响应预定义的快捷键组合
        /// 支持的快捷键：
        /// - Ctrl+H：切换窗口的显示/隐藏状态
        /// - Escape：将窗口最小化到系统托盘
        /// </summary>
        /// <param name="sender">事件发送者</param>
        /// <param name="e">键盘事件参数，包含按键信息和修饰键状态</param>
        private void OnKeyDown(object? sender, KeyEventArgs e)
        {
            // Ctrl+H: 隐藏/显示窗口
            if (e.KeyModifiers == KeyModifiers.Control && e.Key == Key.H)
            {
                if (_mainWindow?.IsVisible == true)
                {
                    _trayManager?.HideMainWindow();
                }
                else
                {
                    _trayManager?.ShowMainWindow();
                }
                e.Handled = true;
            }

            // Escape: 最小化到托盘
            if (e.Key == Key.Escape)
            {
                _trayManager?.MinimizeToTray();
                e.Handled = true;
            }
        }

        /// <summary>
        /// 释放资源并清理事件处理程序
        /// 从主窗口取消注册KeyDown事件，防止内存泄漏
        /// 在对象销毁前应调用此方法
        /// </summary>
        public void Dispose()
        {
            if (_mainWindow != null)
            {
                _mainWindow.KeyDown -= OnKeyDown;
            }
        }
    }
}